package controller

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"

	"github.com/wailsapp/wails/v2/pkg/runtime"
)

type WeatherService struct {
	Base
	apiKey  string
	baseURL string
}

func NewWeatherService() *WeatherService {
	return &WeatherService{
		apiKey:  "73df6cceca804808b9e0ea6514fb7c4c", // 替换为你的天气API密钥
		baseURL: "https://ne6apw8nje.re.qweatherapi.com",
	}
}

// 定义对应的结构体
type WeatherResponse struct {
	Code       string `json:"code"`
	UpdateTime string `json:"updateTime"`
	FxLink     string `json:"fxLink"`
	Now        struct {
		ObsTime   string `json:"obsTime"`
		Temp      string `json:"temp"`
		FeelsLike string `json:"feelsLike"`
		Icon      string `json:"icon"`
		Text      string `json:"text"`
		Wind360   string `json:"wind360"`
		WindDir   string `json:"windDir"`
		WindScale string `json:"windScale"`
		WindSpeed string `json:"windSpeed"`
		Humidity  string `json:"humidity"`
		Precip    string `json:"precip"`
		Pressure  string `json:"pressure"`
		Vis       string `json:"vis"`
		Cloud     string `json:"cloud"`
		Dew       string `json:"dew"`
	} `json:"now"`
	Refer struct {
		Sources []string `json:"sources"`
		License []string `json:"license"`
	} `json:"refer"`
}

func (w *WeatherService) GetWeather(cityid string) (*WeatherResponse, error) {
	url := fmt.Sprintf("%s/v7/weather/now?location=%s&key=%s", w.baseURL, cityid, w.apiKey)
	runtime.LogDebugf(w.ctx, "天气API请求%v", url)
	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("API请求失败，状态码: %d", resp.StatusCode)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	var weatherData WeatherResponse
	err = json.Unmarshal(body, &weatherData)
	if err != nil {
		return nil, err
	}
	runtime.LogDebugf(w.ctx, "天气API响应%v", weatherData)
	return &weatherData, nil
}

type CityResponse struct {
	Code     string `json:"code"`
	Location []struct {
		ID        string `json:"id"`
		Name      string `json:"name"`
		Lat       string `json:"lat"`
		Lon       string `json:"lon"`
		Country   string `json:"country"`
		Adm2      string `json:"adm2"`
		Adm1      string `json:"adm1"`
		Tz        string `json:"tz"`
		UtcOffset string `json:"utcOffset"`
		IsDst     string `json:"isDst"`
		Type      string `json:"type"`
		Rank      string `json:"rank"`
		FxLink    string `json:"fxLink"`
	} `json:"location"`
	Refer struct {
		Sources []string `json:"sources"`
		License []string `json:"license"`
	} `json:"refer"`
}

func (w *WeatherService) SearchCities(cityid string) (*CityResponse, error) {
	// 构建请求URL
	baseURL := fmt.Sprintf("%s/geo/v2/city/lookup", w.baseURL)
	// 编码查询参数
	params := url.Values{}
	params.Add("location", cityid)
	params.Add("key", w.apiKey)

	requestURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

	// 创建HTTP请求
	req, err := http.NewRequest("GET", requestURL, nil)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/json")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 检查状态码
	if resp.StatusCode != http.StatusOK {
		body, _ := ioutil.ReadAll(resp.Body)
		return nil, fmt.Errorf("API返回错误: %s, 响应: %s", resp.Status, string(body))
	}

	// 解析响应
	var result CityResponse
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查API返回的业务代码
	if result.Code != "200" {
		return nil, fmt.Errorf("API业务错误: %s", result.Code)
	}

	return &result, nil
}

type Weather24Hour struct {
	Code       string `json:"code"`
	UpdateTime string `json:"updateTime"`
	FxLink     string `json:"fxLink"`
	Hourly     []struct {
		FxTime    string `json:"fxTime"`
		Temp      string `json:"temp"`
		Icon      string `json:"icon"`
		Text      string `json:"text"`
		Wind360   string `json:"wind360"`
		WindDir   string `json:"windDir"`
		WindScale string `json:"windScale"`
		WindSpeed string `json:"windSpeed"`
		Humidity  string `json:"humidity"`
		Pop       string `json:"pop"`
		Precip    string `json:"precip"`
		Pressure  string `json:"pressure"`
		Cloud     string `json:"cloud"`
		Dew       string `json:"dew"`
	} `json:"hourly"`
	Refer struct {
		Sources []string `json:"sources"`
		License []string `json:"license"`
	} `json:"refer"`
}

func (w *WeatherService) GetWeather24Hour(cityid string) (*Weather24Hour, error) {
	// 构建请求URL
	baseURL := fmt.Sprintf("%s/v7/weather/24h", w.baseURL)
	// 编码查询参数
	params := url.Values{}
	params.Add("location", cityid)
	params.Add("key", w.apiKey)

	requestURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

	// 创建HTTP请求
	req, err := http.NewRequest("GET", requestURL, nil)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/json")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 检查状态码
	if resp.StatusCode != http.StatusOK {
		body, _ := ioutil.ReadAll(resp.Body)
		return nil, fmt.Errorf("API返回错误: %s, 响应: %s", resp.Status, string(body))
	}

	// 解析响应
	var result Weather24Hour
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查API返回的业务代码
	if result.Code != "200" {
		return nil, fmt.Errorf("API业务错误: %s", result.Code)
	}

	return &result, nil
}

type Weather15Day struct {
	Code       string `json:"code"`
	UpdateTime string `json:"updateTime"`
	FxLink     string `json:"fxLink"`
	Daily      []struct {
		FxDate         string `json:"fxDate"`
		Sunrise        string `json:"sunrise"`
		Sunset         string `json:"sunset"`
		Moonrise       string `json:"moonrise"`
		Moonset        string `json:"moonset"`
		MoonPhase      string `json:"moonPhase"`
		MoonPhaseIcon  string `json:"moonPhaseIcon"`
		TempMax        string `json:"tempMax"`
		TempMin        string `json:"tempMin"`
		IconDay        string `json:"iconDay"`
		TextDay        string `json:"textDay"`
		IconNight      string `json:"iconNight"`
		TextNight      string `json:"textNight"`
		Wind360Day     string `json:"wind360Day"`
		WindDirDay     string `json:"windDirDay"`
		WindScaleDay   string `json:"windScaleDay"`
		WindSpeedDay   string `json:"windSpeedDay"`
		Wind360Night   string `json:"wind360Night"`
		WindDirNight   string `json:"windDirNight"`
		WindScaleNight string `json:"windScaleNight"`
		WindSpeedNight string `json:"windSpeedNight"`
		Humidity       string `json:"humidity"`
		Precip         string `json:"precip"`
		Pressure       string `json:"pressure"`
		Vis            string `json:"vis"`
		Cloud          string `json:"cloud"`
		UvIndex        string `json:"uvIndex"`
	} `json:"daily"`
	Refer struct {
		Sources []string `json:"sources"`
		License []string `json:"license"`
	} `json:"refer"`
}

func (w *WeatherService) GetWeather15Day(cityid string) (*Weather15Day, error) {
	// 构建请求URL
	baseURL := fmt.Sprintf("%s/v7/weather/15d", w.baseURL)
	// 编码查询参数
	params := url.Values{}
	params.Add("location", cityid)
	params.Add("key", w.apiKey)

	requestURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

	// 创建HTTP请求
	req, err := http.NewRequest("GET", requestURL, nil)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/json")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 检查状态码
	if resp.StatusCode != http.StatusOK {
		body, _ := ioutil.ReadAll(resp.Body)
		return nil, fmt.Errorf("API返回错误: %s, 响应: %s", resp.Status, string(body))
	}

	// 解析响应
	var result Weather15Day
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查API返回的业务代码
	if result.Code != "200" {
		return nil, fmt.Errorf("API业务错误: %s", result.Code)
	}

	return &result, nil
}
